﻿using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RLProject1.Model.AMEEWorld;

namespace RLProject1.UnitTest
{
    [TestClass]
    public class BesuchteZustaendeTest
    {
        [TestMethod]
        public void BesuchteZustaende_Add() {
            BesuchteZustaende testObj = new BesuchteZustaende(10);
            Assert.AreEqual<int>(0, testObj.Count, "Neues Objekt muss Count=0 haben. Erhalten: {0}", testObj.Count);

            for (int i = 1; i <= 10; i++) {
                testObj.Add(i);
            }
            Assert.AreEqual<int>(10, testObj.Count, "Erwartet nach 10xAdd Count=10. Erhalten: {0}", testObj.Count);
            testObj.Add(11);
            Assert.AreEqual<int>(11, testObj.Count, "Erwartet nach 11xAdd Count=11. Erhalten: {0}", testObj.Count);
        }

        [TestMethod]
        public void BesuchteZustaende_Enumerate() {
            BesuchteZustaende testObj = new BesuchteZustaende(10);
            Assert.AreEqual<int>(0, testObj.Count, "Neues Objekt muss Count=0 haben. Erhalten: {0}", testObj.Count);

            for (int i = 1; i <= 11; i++) {
                testObj.Add(i);
            }
            IEnumerator<int> enumerator = testObj.GetEnumerator();
            Assert.IsNotNull(enumerator,"Enumerator ist null!!");
            for (int i = 0; i < 11; i++) {
                bool hasNext = enumerator.MoveNext();
                Assert.IsTrue(hasNext,"{0}'tes MoveNext nicht true", hasNext);
                int current = enumerator.Current;
                int erwartet = 11-i;
                Assert.AreEqual<int>(erwartet, current, "{0}'tes Element erwartet {1}, erhalten {2}", i, erwartet, current);
            }
        }

        [TestMethod]
        public void BesuchteZustaende_Truncate_und_Enumerate() {
            BesuchteZustaende testObj = new BesuchteZustaende(10);
            Assert.AreEqual<int>(0, testObj.Count, "Neues Objekt muss Count=0 haben. Erhalten: {0}", testObj.Count);

            for (int i = 1; i <= 8; i++) {
                testObj.Add(i);
            }
            testObj.Truncate(3);
            Assert.AreEqual<int>(3, testObj.Count, "Add 8, Truncate 5 (ab index 3). Erwartet Count=3. Erhalten Count={0}", testObj.Count);
            IEnumerator<int> enumerator = testObj.GetEnumerator();
            Assert.IsNotNull(enumerator, "Enumerator ist null!!");
            for (int i = 0; i < 3; i++) {
                bool hasNext = enumerator.MoveNext();
                Assert.IsTrue(hasNext, "{0}'tes MoveNext nicht true", hasNext);
                int current = enumerator.Current;
                int erwartet = 8 - i;
                Assert.AreEqual<int>(erwartet, current, "{0}'tes Element erwartet {1}, erhalten {2}", i, erwartet, current);
            }
        }

        [TestMethod]
        public void BesuchteZustaende_AddTruncateAdd_und_Enumerate() {
            BesuchteZustaende testObj = new BesuchteZustaende(10);
            Assert.AreEqual<int>(0, testObj.Count, "Neues Objekt muss Count=0 haben. Erhalten: {0}", testObj.Count);

            for (int i = 1; i <= 8; i++) {
                testObj.Add(i);
            }
            testObj.Truncate(3);
            for (int i = 9; i <= 12; i++) {
                testObj.Add(i);
            }
            Assert.AreEqual<int>(7, testObj.Count, "Add 8, Truncate 5 (ab index 3) Add 4. Erwartet Count=7. Erhalten Count={0}", testObj.Count);
            IEnumerator<int> enumerator = testObj.GetEnumerator();
            Assert.IsNotNull(enumerator, "Enumerator ist null!!");
            for (int i = 0; i < 7; i++) {
                bool hasNext = enumerator.MoveNext();
                Assert.IsTrue(hasNext, "{0}'tes MoveNext nicht true", hasNext);
                int current = enumerator.Current;
                int erwartet = 12 - i;
                Assert.AreEqual<int>(erwartet, current, "{0}'tes Element erwartet {1}, erhalten {2}", i, erwartet, current);
            }
        }
    }
}
